题目链接:戳这里
解题思路:
首先将数组×2,这样就可以由求[1, l] 和 [r, n]区间转化为求[r, n + l]区间。再把查询按照r从小到大排序,之所以这样排序,是为了一边修改前缀和,一边存储答案。
在更新点的时候,我们要用一个last[]数组记录当前数字出现的上一个位置,如果再次出现该数字,则
add(last[num[i]], -1);
add(i, 1) ;
这是用了差分数组的思路,把last[num[i]]的值-1,把i的值+1,最终得到的getsum(i)值是不变的,这样就减少了很多不必要的修改。
附ac代码:
1 |
|